import path from 'path'
/**
 * 处理脱离层级的路由
 * @param {*} routes 路由列表
 * @returns 处理之后的路由列表
 */
export const filterRoutes = routes => {
  // 所有子集路由
  const childrenRoutes = getChildrenRoutes(routes)
  // console.log('childrenRoutes', childrenRoutes)
  // 根据子集路由查重操作
  return routes.filter(route => {
    // 把重复的路由表删除
    return !childrenRoutes.find(childrenRoute => childrenRoute.path === route.path)
  })
}

/**
 * 根据routes (过滤之后的routes)生成对应的menu数据
 * @param {*} routes 过滤之后的routes
 * @param {*} basePath 基础路径
 */
export const generateMenu = (routes, basePath = '') => {
  let list = []
  if (Array.isArray(routes) && routes.length > 0) {
    // 将不存在菜单meta的，存在children的子项向上层移动
    const move = []
    routes.forEach(route => {
      // 不存在菜单meta 并且 存在子项
      if (!hasMenuMeta(route.meta) && hasChildren(route.children)) {
        // 将子项展开，并push到move中
        move.push(...route.children)
      } else {
        move.push(route)
      }
    })

    list = move
      .filter(route => hasMenuMeta(route.meta)) // 过滤出来存在菜单meta的所有项
      .map(route => ({
        ...route,
        title: route.meta.title,
        icon: route.meta.icon,
        path: path.resolve(basePath, route.path),
        children: generateMenu(route.children)
      }))
  }
  return list
}

/**
 * 获取所有的子路由列表
 * @param {*} routes 路由列表
 * @returns 子路由列表
 */
const getChildrenRoutes = routes => {
  const list = []
  if (Array.isArray(routes)) {
    routes.forEach(route => {
      if (Array.isArray(route.children) && route.children.length > 0) {
        list.push(...route.children)
      }
    })
  }
  return list
}

// 是否存在子节点
const hasChildren = children => Array.isArray(children) && children.length > 0

// 是否存在菜单Menu
const hasMenuMeta = meta => meta && meta.title && meta.icon
